package com.zmz.Stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Create with IntelliT IDEA
 *
 * @Author: zhengmingzhe
 * @Date: 2022/07/31/15:25
 * @Description: 映射可以将一个流的元素按照一定的映射规则**映射到另一个流中。分为map和flatMap.（注意：这里的map不是集合容器类，别与集合的map混淆！）
 *
 * 1.map:接受一个函数作为参数。该函数会被应用到每个元素上，并将其映射 成一个新的元素。
 *
 *2.flatmap：接受一个函数作为参数，将流中的每个值都换成另一个流，然后把所有的流连接成一个流。
 */
public class Stream06 {
    public static void main(String[] args) {
        //1.将英文字符串数组的元素全部改为大写
        String[] strArr ={"abcd","sad","fds","asaa" };
        List<String> listStr = Arrays.asList(strArr);
        System.out.println(listStr);

        System.out.println("___________");
        //使用map调用转换大写函数映射再直接遍历打印 输出结果为 ABCD	SAD	FDS	ASAA
        listStr.stream().map(t->t.toUpperCase()).forEach(t->System.out.print(t+"\t"));
        System.out.println("___________");
        //也可以规约成一个结合再重新输出如下  输出结果为 [ABCD, SAD, FDS, ASAA]
        List<String> newList = listStr.stream().map(t->t.toUpperCase()).collect(Collectors.toList());
        System.out.println(newList);




        System.out.println("整数数组每个元素加3");
        //整数数组每个元素加3
        Integer[] integers ={1,2,3,3,2,3};
        Arrays.stream(integers).map(t->t+3).forEach(t->System.out.println(t));

        //将员工的工资加1000  输出[9000, 8000, 8800, 13000, 23000](原来的集合中的值也会改变)
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("的撒", 8000, 22, "女", "武汉"));
        personList.add(new Person("法按时", 7000, 22, "女", "武汉"));
        personList.add(new Person("的阿萨", 7800, 22, "男", "武汉"));
        personList.add(new Person("答案", 12000, 12, "女", "武汉"));
        personList.add(new Person("滴放", 22000, 21, "女", "北京"));
        List<Integer> newPersonlist = personList.stream().map(t->{
            t.setSalary(t.getSalary()+1000);
            return t.getSalary();
                }
        ).collect(Collectors.toList());
        System.out.println(newPersonlist);
        //如果需要返回对象(原来的集合中的值也会改变)
//        List<Person> newPersonlist1 = personList.stream().map(t->{
//                    t.setSalary(t.getSalary()+1000);
//                    return t;
//                }
//        ).collect(Collectors.toList());
//        System.out.println(newPersonlist1);
        //不改变原来的值
        List<Person> newPersonlist2 = personList.stream().map( t->{
                 Person person = new Person(t.getName(),t.getSalary(),t.getAge(),t.getSex(),t.getArea());
                 person.setSalary(t.getSalary()+1000);
                 return person;
        }
        ).collect(Collectors.toList());
        System.out.println(newPersonlist2);


        //将两个字符数分割处理后组合并成一个新的字符数组(注意多个流处理合并的时候使用flatMap) 输出结果为[s, a, d, s, a, AADAS]
        List<String> stringList =Arrays.asList("s-a-d-s-a","AADAS");
        List<String> newStrlist = stringList.stream().flatMap(t->{
            //这里会执行两次因为有两个流
            String[] split =t.split("-");
            //将新的数组变成流返回再进行规约
            return Arrays.stream(split);
        }).collect(Collectors.toList());
        System.out.println(newStrlist);




    }


}
